﻿using System;
using System.Configuration;
using System.IO;
using ClickLand.CorporacionPlaza.Presentacion.Contratos.AdministracionVentas;
using ClickLand.CorporacionPlaza.Presentacion.Controladores;
using ClickLand.CorporacionPlaza.Presentacion.CorporacionPlazaWS;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace ClickLand.CorporacionPlaza.Presentacion.Presentadores.AdministracionVenta
{
    /// <summary> Clase que hace de presentador para la vsta que consulta la lista de ventas de un contrato </summary>
    public class PresentadorConsultarVentas:PresentadorBase
    {
        #region Atributos

        /// <summary> Objeto que posee la definicion del controlador del modulo </summary>
        private ControladorAdministracionContrato _controlador;


        /// <summary> Objeto que posee la definicion de las propiedades de la vista </summary>
        private readonly IConsultarVentas _vista;

        #endregion

        #region Constructor

        /// <summary> Constructor de la clase </summary>
        /// <param name="vista"> Objeto que posee las propiedades de la vista</param>
        public PresentadorConsultarVentas(IConsultarVentas vista)
        {
            _vista = vista;
            _controlador = new ControladorAdministracionContrato();
        }

        #endregion

        #region Metodos

        /// <summary> Metodo que realiza las operaciones para cargar la pagina </summary>
        public void CargarPagina()
        {

            var contrato = new ContratoDto
            {
                Estado = 1,
                Establecimiento = new EstablecimientoDto() { Id = 2 }
            };
            _vista.ListaContratos = _controlador.BuscarContrato(contrato);
        }

        
        /// <summary> Metodo que se encarga de buscar las ventas dados los parametros indicados </summary>
        public void BuscarVentas()
        {
            var lista = _controlador.BuscarVentas(_vista.ContratoSeleccionado, _vista.FechaInicio,
                                                             _vista.FechaFin);
            _vista.ListaVentas = lista;
        }


        /// <summary> Metodo que realiza la operacion para imprimir los reportes </summary>
        public void ImprimirReporte()
        {
            Document document = new Document();
            PdfWriter writer = PdfWriter.GetInstance(document,
                                  new FileStream(ConfigurationManager.AppSettings["RutaDescarga"] +
                                      "ReporteVentaMes.pdf", FileMode.Create));
            PdfPTable tabla;
            PdfPCell celdaTitulo;
            string[] titulosCeldas;
            Paragraph ptitulo;
            Chunk titulo;

            try
            {
                document.SetMargins(36, 36, 36, 100);
                document.Open();


                #region Cuerpo del Reporte
                
                #region Tabla Reporte

                #region Titulo de Tabla

                titulo = new Chunk("Reporte del Mes de " + _vista.FechaInicio.ToString("MMMM").ToUpper() + " del " + _vista.FechaInicio.ToString("yyyy").ToUpper() + " \n\n",
                                         FontFactory.GetFont("Verdana", 11, Font.BOLD));
                ptitulo = new Paragraph();
                ptitulo.Alignment = Element.ALIGN_CENTER;
                ptitulo.Add(titulo);
                document.Add(ptitulo);
                #endregion

                DateTime mesAnterior = _vista.FechaInicio.AddMonths(-1);
                DateTime añoAnterior = _vista.FechaInicio.AddYears(-1);
                var lista = _vista.ListaVentas;
                if (lista.Count > 0)
                {
                    #region Encabezado de la tabla
                    tabla = new PdfPTable(9);
                    //tabla.SpacingBefore = 10;
                    tabla.WidthPercentage = 100;
                    tabla.HorizontalAlignment = Element.ALIGN_LEFT;
                    titulosCeldas = _vista.TituloReporte.Split(';');

                    celdaTitulo =
                        new PdfPCell(new Phrase(string.Empty, FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    celdaTitulo.Colspan = 5;
                    tabla.AddCell(celdaTitulo);

                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[0] + "\n" + mesAnterior.ToString("MMM-yyyy").ToUpper() + "--" + _vista.FechaInicio.ToString("MMM-yyyy").ToUpper(), FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    celdaTitulo.Colspan = 2;
                    tabla.AddCell(celdaTitulo);

                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[1] + "\n" + añoAnterior.ToString("MMM-yyyy").ToUpper() + "--" + _vista.FechaInicio.ToString("MMM-yyyy").ToUpper(), FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    celdaTitulo.Colspan = 2;
                    tabla.AddCell(celdaTitulo);

                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[2], FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);

                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[3], FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);

                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[4] + "\n" + añoAnterior.ToString("MMM-yyyy").ToUpper(), FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);

                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[5] + "\n" + mesAnterior.ToString("MMM-yyyy").ToUpper(), FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);

                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[6] + "\n" + _vista.FechaInicio.ToString("MMM-yyyy").ToUpper(), FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);

                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[7], FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);

                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[8], FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);

                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[9], FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);
                    
                    celdaTitulo =
                        new PdfPCell(new Phrase(titulosCeldas[10], FontFactory.GetFont("Verdana", 8, BaseColor.BLACK)));
                    celdaTitulo.HorizontalAlignment = Element.ALIGN_CENTER;
                    celdaTitulo.VerticalAlignment = Element.ALIGN_MIDDLE;
                    celdaTitulo.BackgroundColor = BaseColor.WHITE;
                    tabla.AddCell(celdaTitulo);

                    #endregion

                    #region Cuerpo de la Tabla

                    
                    foreach (var venta in lista)
                    {
                        float montnoAnoAnterior = 0;
                        float montoMesAnterior = 0;
                        float porcentaje = 0;
                        float diferencia = 0;


                        var consulta = _controlador.BuscarVentas(venta.Contrato, _vista.FechaInicio.AddYears(-1),
                                                                         _vista.FechaInicio.AddYears(-1).AddDays(1));
                        if(consulta != null && consulta.Count > 0)
                            montnoAnoAnterior = consulta[0].Monto;
                        
                        
                        consulta = _controlador.BuscarVentas(venta.Contrato, _vista.FechaInicio.AddMonths(-1),
                                                                     _vista.FechaInicio.AddDays(-1));

                        if (consulta != null && consulta.Count > 0)
                            montoMesAnterior = consulta[0].Monto;

                        BaseColor color = BaseColor.WHITE;
                        PdfPCell celdaContenido = new PdfPCell(new Phrase(venta.Contrato.Establecimiento.Numero, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(venta.Contrato.NombreComercial, FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(montnoAnoAnterior.ToString("N"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(montoMesAnterior.ToString("N"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        celdaContenido = new PdfPCell(new Phrase(venta.Monto.ToString("N"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);


                        celdaContenido = new PdfPCell(new Phrase((venta.Monto - montnoAnoAnterior).ToString("N"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                        diferencia = venta.Monto - montnoAnoAnterior;

                        porcentaje = montnoAnoAnterior > 0 ? diferencia * 100 / montnoAnoAnterior : 0;

                        celdaContenido = new PdfPCell(new Phrase(porcentaje.ToString("N"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);


                        diferencia = venta.Monto - montoMesAnterior;
                        porcentaje = montoMesAnterior > 0 ? diferencia * 100 / montoMesAnterior : 0;
                        celdaContenido = new PdfPCell(new Phrase((venta.Monto - montoMesAnterior).ToString("N"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);


                        celdaContenido = new PdfPCell(new Phrase(porcentaje.ToString("N"), FontFactory.GetFont("Verdana", 8)));
                        celdaContenido.HorizontalAlignment = Element.ALIGN_CENTER;
                        celdaContenido.BackgroundColor = color;
                        tabla.AddCell(celdaContenido);

                    }

                    document.Add(tabla);

                    #endregion
                }
                else
                {
                    Paragraph parrafo = new Paragraph(new Chunk("No Existe Clientes \n\n",
                                                                FontFactory.GetFont("Verdana", 10, Font.BOLD)));
                    parrafo.Alignment = Element.ALIGN_CENTER;
                    document.Add(parrafo);
                }

                #endregion

                #endregion
                
                document.Close();
            }
            catch (Exception e)
            {
                if (document.IsOpen())
                    document.Close();
            }
        }
        #endregion
    }
}
